package demo.spring.framework.jdbc.datasource.lookup;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
import org.springframework.util.Assert;

/**
 * 
 * @author junying.han
 *
 */
public class RoutingDataSourceDemo extends AbstractRoutingDataSource {

    public static final String MASTER = "master";
    public static final String SLAVE = "slave";
    /**
     * 数据源标识，保存在线程变量中，避免多线程操作数据源时互相干扰
     */
    private static final ThreadLocal<String> KEY = new ThreadLocal<String>() {
        @Override
        protected String initialValue() {
            return MASTER;
        }
    };

    @Override
    protected Object determineCurrentLookupKey() {
        return KEY.get() == null ? MASTER : KEY.get();
    }

    /**
     * 设置数据源
     * 
     * @param dataSource 数据源名称
     */
    public static void setDataSource(String dataSource) {
        Assert.notNull(dataSource, "dataSource cannot be null");
        KEY.set(dataSource);
    }

    /**
     * 获取数据源
     * 
     * @return
     */
    public static String getDatasource() {
        return KEY.get();
    }

    /**
     * 清除数据源。 移除此线程局部变量的值。这可能有助于减少线程局部变量的存储需求。 如果再次访问此线程局部变量，那么在默认情况下它将拥有其
     * initialValue。
     */
    public static void clearDataSource() {
        KEY.remove();
    }

}
